package com.bascker.algorithm.practice.arr.middle.group_anagrams.err;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 思路：
 * 给所有小写字母各自一个值，那么每一个字符串的都有一个和值 sum_i。
 * 若和值 sum 相等，则说明两个字符串是字母异位词
 *
 * ==> 没考虑到和值相同的场景
 * <pre>
 * case:
 * strs =["ac","d"]
 *
 * ac 的和值 = d，按这个思路来就会出错。
 * </pre>
 */
public class Solution {

    // a ~ z
    private int[] numFlags = new int[]{
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
            11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
            21, 22, 23, 24, 25, 26
    };

    public List<List<String>> groupAnagrams(String[] strs) {
        // 边界值
        if (null == strs || strs.length == 0) {
            return new ArrayList<>();
        }

        // key - sum, value - elements
        Map<Integer, List<String>> hash = new HashMap<>();
        // 遍历数组
        for (int i = 0; i < strs.length; i ++) {
            String s = strs[i];
            int sum = 0;
            for (int j = 0; j < s.length(); j ++) {
                sum += numFlags[s.charAt(j) - 'a'];
            }

            List<String> elements = hash.getOrDefault(sum, new ArrayList<>());
            elements.add(s);

            hash.put(sum, elements);
        }

        List<List<String>> result = new ArrayList<>();
        for (Map.Entry<Integer, List<String>> entry : hash.entrySet()) {
            result.add(entry.getValue());
        }

        return result;
    }

}
